package org.example.java.base;

/**
 * 常量池(constant pool)指的是在编译期被确定，并被保存在已编译的.class文件中的一些数据。
 * 它包括了关于类、方法、接口等中的常量，也包括字符串常量。
 */
public class ConstantPool {
  static class A {
    String a;
  }

  static class B {
    String b;
  }

  public static void stringequals() {
    System.out.println("====object stringequals====");
    A a = new A();
    a.a = "hans";
    B b = new B();
    b.b = "hans";
    System.out.println("a,b:" + (a.a == b.b));
    b.b += "_zjt";
    System.out.println("a,b:" + (a.a == b.b));
  }

  public static void stringequals(String[] args) {
    System.out.println("====string equals====");
    String s0 = "hans";
    String s1 = "hans";
    String s2 = "ha" + "ns";
    String s3 = new String("hans");
    //当调用 intern 方法时，如果池已经包含一个等于此 String 对象的字符串（用 equals(Object) 方法确定），则返回池中的字符串。
    // 否则，将此 String 对象添加到池中，并返回此 String 对象的引用。
    String s4 = s3.intern();
    String s5 = "ha" + new String("ns");
    System.out.println("s0,s1:" + (s0 == s1));
    System.out.println("s0,s2:" + (s0 == s2));
    System.out.println("s0,s3:" + (s0 == s3));
    System.out.println("s0,s4:" + (s0 == s4));
    System.out.println("s0,s5:" + (s0 == s5));
    System.out.println("s0,args[0]:" + (s0 == args[0]));
  }
  public static void longequals(String[] args) {
    System.out.println("====long equals====");
    Long l0 = 1L;
    Long l1 = 1L;
    Long l2 = new Long(1l);
    Long l3 = l2.longValue();
    Long l4 = Long.valueOf(args[0]);
    System.out.println("l0,l1:" + (l0 == l1));
    System.out.println("l0,l2:" + (l0 == l2));
    System.out.println("l0,l3:" + (l0 == l3));
    System.out.println("l0,l4:" + (l0 == l4));
  }

  public static void main(String[] args) {
    longequals(args);//1
//    stringequals();
//    stringequals(args);//hans
  }

}
